package com.zhuhjay.service.system.service.impl;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zhuhjay.common.base.exception.BasicBusinessException;
import com.zhuhjay.common.base.util.BeanBuilder;
import com.zhuhjay.common.web.model.vo.PageInfoVo;
import com.zhuhjay.service.system.mapper.SystemConfigMapper;
import com.zhuhjay.service.system.model.dto.ConfigDto;
import com.zhuhjay.service.system.model.entity.SystemConfig;
import com.zhuhjay.service.system.service.SystemConfigService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author ZhuHJay
 * @since 2023-08-30
 */
@Slf4j
@Service
public class SystemConfigServiceImpl extends ServiceImpl<SystemConfigMapper, SystemConfig> implements SystemConfigService {

    @Override
    public PageInfoVo<SystemConfig> configsPage(Integer pageNum, Integer pageSize) {
        Page<SystemConfig> page = this.lambdaQuery()
                .orderByAsc(SystemConfig::getId)
                .page(Page.of(pageNum, pageSize));
        return BeanBuilder.builder(PageInfoVo<SystemConfig>::new)
                .with(PageInfoVo::setCurrent, page.getCurrent())
                .with(PageInfoVo::setSize, page.getSize())
                .with(PageInfoVo::setTotal, page.getTotal())
                .with(PageInfoVo::setRecords, page.getRecords())
                .build();
    }

    @Override
    public void add(ConfigDto config) {
        if (this.hasConfigKey(config.getConfigKey())) {
            throw new BasicBusinessException("键名已存在");
        }
        this.save(config.toEntity());
    }

    @Override
    public void edit(Integer id, ConfigDto config) {
        SystemConfig systemConfig = this.getById(id);
        if (systemConfig == null) {
            throw new BasicBusinessException("配置不存在");
        }
        // 不可进行configKey的修改
        if (!systemConfig.getConfigKey().equals(config.getConfigKey())) {
            throw new BasicBusinessException("不可修改键名");
        }
        systemConfig.setConfigValue(config.getConfigValue());
        systemConfig.setConfigName(config.getConfigName());
        systemConfig.setRemark(config.getRemark());
        this.updateById(systemConfig);
    }

    @Override
    public void deleteConfig(Integer id) {
        SystemConfig systemConfig = this.getById(id);
        if (systemConfig == null) {
            throw new BasicBusinessException("配置不存在");
        }
        this.removeById(id);
    }

    @Override
    public String getConfigValue(String configKey) {
        SystemConfig systemConfig = this.lambdaQuery()
                .eq(SystemConfig::getConfigKey, configKey)
                .one();
        if (systemConfig != null) {
            return systemConfig.getConfigValue();
        } else {
            log.error("系统${{}}配置不存在, 请检查", configKey);
            throw new BasicBusinessException("请求失败, 请联系管理员");
        }
    }

    private boolean hasConfigKey(String configKey) {
        return this.lambdaQuery()
                .eq(SystemConfig::getConfigKey, configKey)
                .count() > 0;
    }

}
